#ifndef IACCOUNT_HH
#define IACCOUNT_HH
#include <string>
#include <vector>
// Forward declaration to avoid circular inclusion.Defines the interface for account operations.
namespace Bank {
    class Transaction;
    class IAccount {
    public:
        virtual ~IAccount() = default;

        virtual std::string getAccountId() const = 0;
        virtual std::string getOwnerName() const = 0;
        virtual double getBalance() const = 0;
        virtual std::string getFormattedBalance() const = 0;
        virtual std::string getAccountType() const = 0;

        virtual bool transferTo(IAccount* toAccount, double amount, const std::string& note = "") = 0;
        virtual void displayInfo() const = 0;
        virtual void deposit(double amount) = 0;
        virtual bool withdraw(double amount) = 0;
        virtual void receiveTransfer(double amount) = 0; 

        // Virtual function to access the account interface for a specific customer,
        // allowing interaction with the account (e.g., viewing transactions, making transfers).
        // This function is pure virtual and must be implemented by derived classes.
        virtual void accessAccountInterface(
            const std::string& customerName,
            const std::vector<Transaction>& allTransactions
        ) = 0;
    };
}
#endif

